//题目:
// 给你两个字符串 s 和 goal ，只要我们可以通过交换 s 中的两个字母得到与 goal 相等的结果，就返回 true ；否则返回 false 。
// 交换字母的定义是：取两个下标 i 和 j （下标从 0 开始）且满足 i != j ，接着交换 s[i] 和 s[j] 处的字符。
// 例如，在 "abcd" 中交换下标 0 和下标 2 的元素可以生成 "cbad" 。

#include<iostream>
#include<string>

using namespace std;
//代码：
class Solution {
public:
    bool has_repeat(string s)
    {
        int arr[26]={0};
        for(const auto& ch:s)
        {
            arr[ch-'a']++;
            if(arr[ch-'a']>=2)return true;
        }
        return false;
    }
    bool buddyStrings(string s, string goal) 
    {
        // if(s.size()!=goal.size())return false;
        // //分两类：
        // //1、s==goal && 字符串有重复字母
        // if(s==goal && has_repeat(s))return true;
        // //2.s和goal对应字符有两个不相同，其它位置字母都相同
        // string tmps,tmpg;
        // int cnt=0;
        // for(int i=0;i<s.size();i++)
        // {
        //     if(s[i]!=goal[i])   
        //     {
        //         cnt++;
        //         tmps+=s[i];
        //         tmpg+=goal[i];
        //     }
        // }
        // if(cnt==2 && tmps[0]==tmpg[1] && tmps[1]==tmpg[0])return true;
        // else return false;

        //小小优化一下：
        if(s.size()!=goal.size())return false;
        string tmps,tmpg;
        int cnt=0,arr[26]={0},flag=0;
        for(int i=0;i<s.size();i++)
        {
            if(s[i]!=goal[i])   
            {
                cnt++;
                tmps+=s[i];
                tmpg+=goal[i];
            }
            if(++arr[s[i]-'a']>=2)flag=1;
        }
        if(cnt==2 && tmps[0]==tmpg[1] && tmps[1]==tmpg[0])return true;
        else if(cnt==0 && flag)return true;
        else return false;
    }
};